"""验证回测报告数据的正确性."""

import json
import re
from pathlib import Path
from typing import Dict, Any

# 报告中的数据
REPORT_DATA = {
    "decision_tree": {"annual_return": 161.53, "max_dd": 12.82, "sharpe": 7.30, "win_rate": 3.2, "trades": 330},
    "lightgbm": {"annual_return": 321.43, "max_dd": 14.30, "sharpe": 14.88, "win_rate": 5.5, "trades": 416},
    "linear_regression": {"annual_return": 49.85, "max_dd": 20.67, "sharpe": 2.13, "win_rate": 9.8, "trades": 204},
    "logistic_regression": {"annual_return": 0.00, "max_dd": 0.00, "sharpe": 0.00, "win_rate": 0.0, "trades": 0},
    "random_forest": {"annual_return": 282.16, "max_dd": 5.30, "sharpe": 14.18, "win_rate": 5.5, "trades": 338},
    "svm": {"annual_return": 0.00, "max_dd": 0.00, "sharpe": 0.00, "win_rate": 0.0, "trades": 0},
    "xgboost": {"annual_return": 318.58, "max_dd": 7.07, "sharpe": 15.20, "win_rate": 4.7, "trades": 396},
    "buy_and_hold": {"annual_return": -8.93, "max_dd": 64.08, "sharpe": -0.25, "win_rate": 0.0, "trades": 0},
}


def verify_calculation_logic():
    """验证计算逻辑."""
    print("=" * 80)
    print("1. 验证计算逻辑")
    print("=" * 80)
    
    issues = []
    
    # 1.1 年化收益率计算验证
    print("\n1.1 年化收益率计算")
    print("  公式: (1 + total_return) ** (252 / n_days) - 1")
    print("  使用252个交易日进行年化 ✓")
    print("  注意: 需要验证 n_days 是否正确统计")
    
    # 1.2 最大回撤计算验证
    print("\n1.2 最大回撤计算")
    print("  公式: drawdown = (equity_curve - cummax) / cummax")
    print("  max_drawdown = drawdown.min() (应为负值)")
    print("  报告中使用 abs() 转换为正数 ✓")
    
    # 检查基准策略的最大回撤
    if REPORT_DATA["buy_and_hold"]["max_dd"] > 0:
        print(f"  ⚠️  基准策略最大回撤为正值: {REPORT_DATA['buy_and_hold']['max_dd']}%")
        print("     这可能是正确的（已取绝对值），但需要确认原始值是否为负")
    
    # 1.3 夏普比率计算验证
    print("\n1.3 夏普比率计算")
    print("  公式: (annualized_return - risk_free_rate) / annualized_volatility")
    print("  risk_free_rate 默认值: 0.0")
    print("  当 volatility = 0 时，sharpe_ratio = 0.0 ✓")
    
    # 检查零交易模型的夏普比率
    for model in ["logistic_regression", "svm"]:
        if REPORT_DATA[model]["sharpe"] != 0.0:
            issues.append(f"{model} 的夏普比率应为0（无交易），但显示为 {REPORT_DATA[model]['sharpe']}")
    
    # 1.4 胜率计算验证
    print("\n1.4 胜率计算")
    print("  逻辑: 基于卖出交易中盈利交易占比")
    print("  盈利判断: total_cost < 0 表示盈利")
    print("  说明: 卖出时 total_cost = capital - new_capital")
    print("        如果 new_capital > capital，则 total_cost < 0，表示盈利 ✓")
    
    # 检查基准策略的胜率
    print("\n  基准策略胜率:")
    print("    基准策略使用日收益率计算胜率（positive_returns / total_returns）")
    print(f"    报告中显示: {REPORT_DATA['buy_and_hold']['win_rate']}%")
    print("    注意: 基准策略的胜率计算方式与其他模型不同")
    
    # 1.5 交易次数统计验证
    print("\n1.5 交易次数统计")
    print("  逻辑: len(all_trades) - 统计所有交易（买入+卖出）")
    print("  注意: 每次完整的交易（买入+卖出）会统计为2次")
    
    # 检查基准策略的交易次数
    if REPORT_DATA["buy_and_hold"]["trades"] != 0:
        issues.append(f"基准策略的交易次数应为0（trades=[]），但显示为 {REPORT_DATA['buy_and_hold']['trades']}")
    else:
        print("  ✓ 基准策略交易次数为0，符合预期")
    
    # 检查零交易模型
    for model in ["logistic_regression", "svm"]:
        if REPORT_DATA[model]["trades"] != 0:
            issues.append(f"{model} 的交易次数应为0，但显示为 {REPORT_DATA[model]['trades']}")
        else:
            print(f"  ✓ {model} 交易次数为0，符合预期")
    
    if issues:
        print("\n⚠️  发现的问题:")
        for issue in issues:
            print(f"  - {issue}")
    else:
        print("\n✓ 计算逻辑验证通过")
    
    return issues


def verify_formatting():
    """验证数据格式化."""
    print("\n" + "=" * 80)
    print("2. 验证数据格式化")
    print("=" * 80)
    
    issues = []
    
    # 2.1 年化收益格式化
    print("\n2.1 年化收益格式化")
    print("  代码: annual_return = metrics.get('annualized_return', 0.0) * 100")
    print("  格式: {annual_return:+.2f}%")
    print("  说明: + 号格式会显示正负号 ✓")
    
    # 检查是否有负收益但未显示负号
    for model, data in REPORT_DATA.items():
        if data["annual_return"] < 0 and "+" in str(data["annual_return"]):
            issues.append(f"{model} 的年化收益为负，但可能显示了+号")
    
    # 2.2 最大回撤格式化
    print("\n2.2 最大回撤格式化")
    print("  代码: max_dd = abs(metrics.get('max_drawdown', 0.0)) * 100")
    print("  格式: {max_dd:.2f}%")
    print("  说明: 取绝对值后转换为百分比 ✓")
    
    # 2.3 夏普比率格式化
    print("\n2.3 夏普比率格式化")
    print("  代码: sharpe = metrics.get('sharpe_ratio', 0.0)")
    print("  格式: {sharpe:.2f}")
    print("  说明: 保留2位小数 ✓")
    
    # 2.4 胜率格式化
    print("\n2.4 胜率格式化")
    print("  代码: win_rate = metrics.get('win_rate', 0.0) * 100")
    print("  格式: {win_rate:.1f}%")
    print("  说明: 转换为百分比，保留1位小数 ✓")
    
    # 2.5 交易次数格式化
    print("\n2.5 交易次数格式化")
    print("  代码: total_trades = metrics.get('total_trades', 0)")
    print("  格式: {total_trades} (整数)")
    print("  说明: 直接显示整数 ✓")
    
    if issues:
        print("\n⚠️  发现的问题:")
        for issue in issues:
            print(f"  - {issue}")
    else:
        print("\n✓ 数据格式化验证通过")
    
    return issues


def verify_data_consistency():
    """验证数据一致性."""
    print("\n" + "=" * 80)
    print("3. 验证数据一致性")
    print("=" * 80)
    
    issues = []
    
    # 3.1 基准策略一致性
    print("\n3.1 基准策略一致性")
    print("  基准策略通过 _compute_baseline_result 生成")
    print("  trades=[]，total_trades应为0")
    
    if REPORT_DATA["buy_and_hold"]["trades"] == 0:
        print("  ✓ 基准策略交易次数为0，符合预期")
    else:
        issues.append(f"基准策略交易次数应为0，但显示为 {REPORT_DATA['buy_and_hold']['trades']}")
    
    # 3.2 零交易模型一致性
    print("\n3.2 零交易模型一致性")
    zero_trade_models = ["logistic_regression", "svm"]
    for model in zero_trade_models:
        data = REPORT_DATA[model]
        if data["trades"] == 0:
            # 检查其他指标是否也为0
            if data["annual_return"] != 0.0 or data["max_dd"] != 0.0 or data["sharpe"] != 0.0:
                issues.append(f"{model} 交易次数为0，但其他指标不全为0: "
                            f"年化收益={data['annual_return']}%, "
                            f"最大回撤={data['max_dd']}%, "
                            f"夏普比率={data['sharpe']}")
            else:
                print(f"  ✓ {model} 所有指标为0，符合预期")
        else:
            issues.append(f"{model} 交易次数不为0: {data['trades']}")
    
    # 3.3 数据范围一致性
    print("\n3.3 数据范围一致性")
    print("  报告显示: 2021-03-23 至 2025-03-04（956个交易日）")
    print("  注意: 需要验证实际回测使用的数据范围是否一致")
    print("  数据范围来自: quant_result.get('data_info', {})")
    print("  实际范围: X_train_val.index[0] 至 X_train_val.index[-1]")
    
    if issues:
        print("\n⚠️  发现的问题:")
        for issue in issues:
            print(f"  - {issue}")
    else:
        print("\n✓ 数据一致性验证通过")
    
    return issues


def verify_data_reasonableness():
    """验证数据合理性."""
    print("\n" + "=" * 80)
    print("4. 验证数据合理性")
    print("=" * 80)
    
    issues = []
    warnings = []
    
    # 4.1 异常高收益检查
    print("\n4.1 异常高收益检查")
    high_return_models = []
    for model, data in REPORT_DATA.items():
        if model == "buy_and_hold":
            continue
        if data["annual_return"] > 300:
            high_return_models.append((model, data["annual_return"]))
            warnings.append(f"{model} 年化收益超过300%: {data['annual_return']}%")
    
    if high_return_models:
        print("  ⚠️  发现高收益模型:")
        for model, ret in high_return_models:
            print(f"    - {model}: {ret}%")
        print("  注意: 需要验证计算是否正确，或是否存在过拟合")
    else:
        print("  ✓ 年化收益在合理范围内")
    
    # 4.2 异常高夏普比率检查
    print("\n4.2 异常高夏普比率检查")
    high_sharpe_models = []
    for model, data in REPORT_DATA.items():
        if model == "buy_and_hold":
            continue
        if data["sharpe"] > 15:
            high_sharpe_models.append((model, data["sharpe"]))
            warnings.append(f"{model} 夏普比率超过15: {data['sharpe']}")
    
    if high_sharpe_models:
        print("  ⚠️  发现高夏普比率模型:")
        for model, sharpe in high_sharpe_models:
            print(f"    - {model}: {sharpe}")
        print("  注意: 夏普比率>15通常表示策略表现优异，但需要验证计算是否正确")
    else:
        print("  ✓ 夏普比率在合理范围内")
    
    # 4.3 低胜率高收益检查
    print("\n4.3 低胜率高收益检查")
    for model, data in REPORT_DATA.items():
        if model == "buy_and_hold":
            continue
        if data["win_rate"] < 10 and data["annual_return"] > 100:
            print(f"  ⚠️  {model}: 胜率={data['win_rate']}%, 年化收益={data['annual_return']}%")
            print("      低胜率高收益可能表示少数大额盈利，这是合理的")
            print("      但需要验证胜率计算是否正确")
    
    # 4.4 最大回撤与年化收益关系检查
    print("\n4.4 最大回撤与年化收益关系检查")
    for model, data in REPORT_DATA.items():
        if model == "buy_and_hold":
            continue
        if data["annual_return"] > 0:
            # 计算回撤/收益比
            dd_return_ratio = abs(data["max_dd"]) / data["annual_return"] if data["annual_return"] > 0 else 0
            if dd_return_ratio < 0.05:  # 回撤小于收益的5%
                print(f"  ⚠️  {model}: 最大回撤={data['max_dd']}%, 年化收益={data['annual_return']}%")
                print(f"      回撤/收益比={dd_return_ratio:.2%}，回撤相对收益很小")
                print("      这可能是合理的（策略表现优异），但需要验证计算")
    
    # 4.5 基准策略数据检查
    print("\n4.5 基准策略数据检查")
    bh_data = REPORT_DATA["buy_and_hold"]
    if bh_data["annual_return"] < 0:
        print(f"  ✓ 基准策略年化收益为负: {bh_data['annual_return']}%，符合市场表现")
    if bh_data["max_dd"] > 50:
        print(f"  ⚠️  基准策略最大回撤较大: {bh_data['max_dd']}%")
        print("      这可能是合理的（买入并持有策略在市场下跌时回撤较大）")
    if bh_data["sharpe"] < 0:
        print(f"  ✓ 基准策略夏普比率为负: {bh_data['sharpe']}，符合负收益情况")
    
    if warnings:
        print("\n⚠️  警告:")
        for warning in warnings:
            print(f"  - {warning}")
    
    if issues:
        print("\n⚠️  发现的问题:")
        for issue in issues:
            print(f"  - {issue}")
    else:
        print("\n✓ 数据合理性验证通过（存在一些警告，但可能是合理的）")
    
    return issues, warnings


def check_specific_issues():
    """检查具体问题."""
    print("\n" + "=" * 80)
    print("5. 检查具体问题")
    print("=" * 80)
    
    issues = []
    
    # 5.1 验证每个模型的数据
    print("\n5.1 各模型数据验证")
    
    # decision_tree
    print("\n  decision_tree:")
    print(f"    年化收益: +161.53%")
    print(f"    最大回撤: 12.82%")
    print(f"    夏普比率: 7.30")
    print(f"    胜率: 3.2%")
    print(f"    交易次数: 330")
    print("    分析: 低胜率但高收益，可能表示少数大额盈利")
    
    # lightgbm
    print("\n  lightgbm:")
    print(f"    年化收益: +321.43% (异常高)")
    print(f"    最大回撤: 14.30%")
    print(f"    夏普比率: 14.88 (异常高)")
    print(f"    胜率: 5.5%")
    print(f"    交易次数: 416")
    print("    分析: 年化收益和夏普比率异常高，需要验证计算")
    
    # linear_regression
    print("\n  linear_regression:")
    print(f"    年化收益: +49.85%")
    print(f"    最大回撤: 20.67%")
    print(f"    夏普比率: 2.13")
    print(f"    胜率: 9.8%")
    print(f"    交易次数: 204")
    print("    分析: 数据看起来合理")
    
    # logistic_regression
    print("\n  logistic_regression:")
    print(f"    所有指标: 0")
    print("    分析: 无交易，所有指标为0 ✓")
    
    # random_forest
    print("\n  random_forest:")
    print(f"    年化收益: +282.16% (异常高)")
    print(f"    最大回撤: 5.30% (相对收益很小)")
    print(f"    夏普比率: 14.18 (异常高)")
    print(f"    胜率: 5.5%")
    print(f"    交易次数: 338")
    print("    分析: 年化收益和夏普比率异常高，最大回撤相对收益很小")
    
    # svm
    print("\n  svm:")
    print(f"    所有指标: 0")
    print("    分析: 无交易，所有指标为0 ✓")
    
    # xgboost
    print("\n  xgboost:")
    print(f"    年化收益: +318.58% (异常高)")
    print(f"    最大回撤: 7.07%")
    print(f"    夏普比率: 15.20 (异常高)")
    print(f"    胜率: 4.7%")
    print(f"    交易次数: 396")
    print("    分析: 年化收益和夏普比率异常高，标记为最佳模型")
    
    # buy_and_hold
    print("\n  buy_and_hold:")
    print(f"    年化收益: -8.93%")
    print(f"    最大回撤: 64.08%")
    print(f"    夏普比率: -0.25")
    print(f"    胜率: 0.0%")
    print(f"    交易次数: 0")
    print("    分析: 基准策略数据看起来合理")
    
    # 5.2 检查数据关系
    print("\n5.2 数据关系检查")
    
    # 检查高收益模型的共同特征
    high_return_models = [m for m, d in REPORT_DATA.items() 
                         if m != "buy_and_hold" and d["annual_return"] > 200]
    print(f"\n  高收益模型 (>200%): {', '.join(high_return_models)}")
    print("  共同特征:")
    print("    - 胜率都很低 (3.2%-5.5%)")
    print("    - 交易次数较多 (330-416)")
    print("    - 最大回撤相对较小 (5.30%-14.30%)")
    print("    - 夏普比率很高 (7.30-15.20)")
    print("  分析: 这些特征可能表示策略通过少数大额盈利获得高收益")
    
    if issues:
        print("\n⚠️  发现的问题:")
        for issue in issues:
            print(f"  - {issue}")
    else:
        print("\n✓ 具体问题检查完成")
    
    return issues


def main():
    """主函数."""
    print("回测报告数据验证")
    print("=" * 80)
    print(f"报告文件: out/sh515790_analysis_report_20251114_1538.md")
    print(f"数据范围: 2021-03-23 至 2025-03-04（956个交易日）")
    
    all_issues = []
    all_warnings = []
    
    # 1. 验证计算逻辑
    issues = verify_calculation_logic()
    all_issues.extend(issues)
    
    # 2. 验证数据格式化
    issues = verify_formatting()
    all_issues.extend(issues)
    
    # 3. 验证数据一致性
    issues = verify_data_consistency()
    all_issues.extend(issues)
    
    # 4. 验证数据合理性
    issues, warnings = verify_data_reasonableness()
    all_issues.extend(issues)
    all_warnings.extend(warnings)
    
    # 5. 检查具体问题
    issues = check_specific_issues()
    all_issues.extend(issues)
    
    # 总结
    print("\n" + "=" * 80)
    print("验证总结")
    print("=" * 80)
    
    if all_issues:
        print(f"\n❌ 发现 {len(all_issues)} 个问题:")
        for i, issue in enumerate(all_issues, 1):
            print(f"  {i}. {issue}")
    else:
        print("\n✓ 未发现严重问题")
    
    if all_warnings:
        print(f"\n⚠️  发现 {len(all_warnings)} 个警告:")
        for i, warning in enumerate(all_warnings, 1):
            print(f"  {i}. {warning}")
    
    print("\n主要发现:")
    print("1. 计算逻辑基本正确，但需要验证:")
    print("   - 年化收益率计算使用252个交易日")
    print("   - 最大回撤计算取绝对值显示")
    print("   - 胜率计算基于卖出交易中盈利交易占比")
    print("   - 交易次数统计所有交易（买入+卖出）")
    print("\n2. 数据格式化正确:")
    print("   - 年化收益使用 + 号格式")
    print("   - 最大回撤取绝对值")
    print("   - 夏普比率保留2位小数")
    print("   - 胜率转换为百分比，保留1位小数")
    print("\n3. 数据一致性:")
    print("   - 基准策略交易次数为0 ✓")
    print("   - 零交易模型所有指标为0 ✓")
    print("\n4. 数据合理性:")
    print("   - 部分模型年化收益异常高 (>300%)，需要验证计算")
    print("   - 部分模型夏普比率异常高 (>15)，需要验证计算")
    print("   - 低胜率高收益可能是合理的（少数大额盈利）")
    print("\n5. 建议:")
    print("   - 验证高收益模型的计算是否正确")
    print("   - 检查是否存在过拟合问题")
    print("   - 验证净值曲线合并逻辑是否正确")
    print("   - 检查交易成本计算是否正确")


if __name__ == "__main__":
    main()

